package 经典排序算法;

import java.util.ArrayList;

/**
 * @ClassName : 桶排
 * @Author : 骆发茂
 * @Date: 2021/3/4 21:00
 * @Description :
 */
public class 桶排序_人为设置桶容量_将数据分到有限数量的桶里_每个桶再分别排序 {

    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<Integer>();
        int bucketSize=9;
        array.add(2);
        array.add(32);
        array.add(321);
        array.add(342);
        array.add(354);
        array.add(64);
        array.add(423);
        array.add(63);
        array.add(673);
        BucketSort(array,9);
    }












    /**
     * 桶排序
     *
     * @param array
     * @param bucketSize
     * @return
     */
    public static ArrayList<Integer> BucketSort(ArrayList<Integer> array, int bucketSize) {
        if (array == null || array.size() < 2)
            return array;
        int max = array.get(0), min = array.get(0);
        // 找到最大值最小值
        for (int i = 0; i < array.size(); i++) {
            if (array.get(i) > max)
                max = array.get(i);
            if (array.get(i) < min)
                min = array.get(i);
        }
        int bucketCount = (max - min) / bucketSize + 1;
        ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketCount);
        ArrayList<Integer> resultArr = new ArrayList<>();
        for (int i = 0; i < bucketCount; i++) {
            bucketArr.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < array.size(); i++) {
            bucketArr.get((array.get(i) - min) / bucketSize).add(array.get(i));
        }
        for (int i = 0; i < bucketCount; i++) {
            if (bucketSize == 1) { // 如果带排序数组中有重复数字时  感谢 @见风任然是风 朋友指出错误
                for (int j = 0; j < bucketArr.get(i).size(); j++)
                    resultArr.add(bucketArr.get(i).get(j));
            } else {
                if (bucketCount == 1)
                    bucketSize--;
                ArrayList<Integer> temp = BucketSort(bucketArr.get(i), bucketSize);
                for (int j = 0; j < temp.size(); j++)
                    resultArr.add(temp.get(j));
            }
        }
        System.out.println(resultArr);
        return resultArr;
    }
}
